<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<html>
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <title>第1章实数集与函数</title>
    <style>
        body{
            margin: 0;
        }
        #content-info{
            width: auto;
            margin: 0 auto;
            text-align: center;
        }
        #author-info{
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        #title{
            text-overflow: ellipsis;
            white-space: nowrap;
            overflow: hidden;
            padding-top: 10px;
            margin-bottom: 2px;
            font-size: 34px;
            color: #505050;
        }
        .text{
            white-space:nowrap;
            text-overflow: ellipsis;
            display: inline-block;
            margin-right: 20px;
            margin-bottom: 2px;
            font-size: 20px;
            color: #8c8c8c;
        }
        #navBar{
            width: auto;
            height: auto;
            position: fixed;
            right:0;
            bottom: 0;
            background-color: #f0f3f4;
            overflow-y: auto;
            text-align: center;
        }
        #svg-container{
            width: 100%;
            overflow-x: scroll;
            min-width: 0px;
            margin: 0 10px;
            overflow: visible;
            position: relative;
        }
        #nav-thumbs{
            overflow-y: scroll;
            padding: 0 5px;
        }
        .nav-thumb{
            position: relative;
            margin: 10px auto;
        }
        .nav-thumb >p{
            text-align: center;
            font-size: 12px;
            margin: 4px 0 0 0;
        }
        .nav-thumb >div{
            position: relative;
            display: inline-block;
            border: 1px solid #c6cfd5;
        }
        .nav-thumb img{
            display: block;
        }
        #main-content{
            bottom: 0;
            left: 0;
            right: 0;
            background-color: #d0cfd8;
            display: flex;
            height: auto;
            flex-flow: row wrap;
            text-align:center;
        }
        #svg-container >svg{
            overflow: visible;
            display: block;
            margin:5px auto;
            margin-bottom: 5px;
        }
        #copyright{
            bottom: 0;
            left: 50%;
            margin: 5px auto;
            font-size: 16px;
            color: #515151;
        }
        #copyright >a{
            text-decoration: none;
            color: #77C;
        }
        .number{
            position: absolute;
            top:0;
            left:0;
            border-top:22px solid #08a1ef;
            border-right: 22px solid transparent;
        }
        .pagenum{
            font-size: 12px;
            color: #fff;
            position: absolute;
            top: -23px;
            left: 2px;
        }
            #navBar::-webkit-scrollbar{
            width: 8px;
            background-color: #f5f5f5;
        }
            #navBar::-webkit-scrollbar-track{
            -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,.3);
            border-radius: 8px;
            background-color: #fff;
        }
            #navBar::-webkit-scrollbar-thumb{
            border-radius: 8px;
            -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,.3);
            background-color: #6b6b70;
        }
        #navBar::-webkit-scrollbar-thumb:hover{
            background-color: #4a4a4f;
        }
</style>
  </head>
  <body>
    <div id="main-area">
      <div id="content-info">
        <div id="content-info">
          <div id="title">第1章实数集与函数</div>
        </div>
        <div id="author-info">
          <div class="text" id="author-name">RUWU</div>
          <div class="text" id="share-time">2024-02-19</div>
        </div>
      </div>
      <div id="main-content">
        <div id="svg-container"><svg id="page0" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink" ed:name="画布 1" width="2159" viewBox="0 0 2159 2343" preserveAspectRadio="xMinYMin meet" ed:hSpacing="30" xmlns="http://www.w3.org/2000/svg" ed:vSpacing="30" height="2343" xmlns:ed="https://www.edrawsoft.com/xml/2017/SVGExtensions/">
    <style type="text/css"><![CDATA[
g[ed\:togtopicid],g[ed\:hyperlink],g[ed\:comment],g[ed\:note] {cursor:pointer;}
g[id] {-moz-user-select: none;-ms-user-select: none;user-select: none;}
svg text::selection,svg tspan::selection{background-color: #4285f4;color: #ffffff;fill: #ffffff;}
.st4 {fill:#0d0d0d;font-family:楷体;font-size:14pt;font-weight:bold}
.st5 {fill:#0d0d0d;font-family:楷体;font-size:14pt}
.st1 {fill:#0d0d0d;font-family:楷体;font-size:18pt;font-weight:bold}
.st3 {fill:#0d0d0d;font-family:楷体;font-size:18pt}
.st2 {fill:#0d0d0d;font-family:楷体;font-size:28pt;font-weight:bold}
.st6 {fill:#111111;font-family:楷体;font-size:14pt}
]]></style>
    <defs/>
    <rect fill="#ffffff" x="0" y="0" width="2159" height="2343"/>
    <path stroke="#96f3ff" transform="matrix(1,0,0,1,586.8,362.88)" id="104" ed:idlist="131,133,133" fill-opacity="0.2" ed:type="boundary" fill="#2196f3" stroke-linejoin="round" ed:parentid="131" stroke-opacity="0.13" stroke-dasharray="3.8,1.2" d="M8,0L875,0C880.4,0,883,2.6,883,8L883,48.9C883,54.2,880.4,56.9,875,56.9L8,56.9C2.6,56.9,0,54.2,0,48.9L0,8C0,2.6,2.6,0,8,0z"/>
    <path stroke="#96f3ff" transform="matrix(1,0,0,1,706.8,1322.16)" id="155" ed:idlist="194,196,196" fill-opacity="0.2" ed:type="boundary" fill="#2196f3" stroke-linejoin="round" ed:parentid="194" stroke-opacity="0.13" stroke-dasharray="3.8,1.2" d="M8,0L875.6,0C881,0,883.6,2.6,883.6,8L883.6,50.3C883.6,55.7,881,58.3,875.6,58.3L8,58.3C2.6,58.3,0,55.7,0,50.3L0,8C0,2.6,2.6,0,8,0z"/>
    <path stroke="#878787" transform="matrix(1,0,0,1,1524.2,1136.78)" id="156" ed:idlist="184,186,186,189,191,191" ed:type="summary" fill="none" stroke-linejoin="round" ed:parentid="184,189" d="M0,0L6,0L6,83.5L12,89.4L6,95.4L6,178.9L0,178.9"/>
    <path stroke="#96f3ff" transform="matrix(1,0,0,1,754.8,2224.95)" id="257" ed:idlist="275,277,277" fill-opacity="0.2" ed:type="boundary" fill="#2196f3" stroke-linejoin="round" ed:parentid="275" stroke-opacity="0.13" stroke-dasharray="3.8,1.2" d="M8,0L1212.2,0C1217.6,0,1220.2,2.6,1220.2,8L1220.2,54C1220.2,59.3,1217.6,62,1212.2,62L8,62C2.6,62,0,59.3,0,54L0,8C0,2.6,2.6,0,8,0z"/>
    <g transform="matrix(1,0,0,1,1530.1,875.01)" id="282" ed:fromid="104" ed:type="relation" ed:toid="155">
        <path fill="none" d="M-60.3,-475C513.4,-463.7,609.4,473.4,60.3,475"/>
        <path stroke="#15831c" stroke-width="3" stroke-linecap="round" fill="none" stroke-linejoin="round" stroke-dasharray="3.8,1.2" d="M-51.6,-474.8C511.3,-454.4,605.6,463.6,69,474.9"/>
        <path stroke-width="1" stroke="#15831c" stroke-linecap="round" fill="#15831c" d="M-60.3,-475C-60.2,-477.4,-58.2,-479.3,-55.9,-479.2C-53.5,-479.2,-51.6,-477.2,-51.6,-474.8C-51.7,-472.4,-53.7,-470.5,-56.1,-470.6C-58.5,-470.6,-60.4,-472.6,-60.3,-475"/>
        <path stroke-width="1" stroke="#15831c" stroke-linecap="round" fill="#15831c" d="M69,479.2L60.3,475L68.9,470.6L69,479.2"/>
        <rect fill="#ffffff" x="316.6" y="-9.6" width="50" height="27.2"/>
        <text class="st1">
            <tspan style="white-space:pre" x="395" y="13.6" textLength="50.00">推导</tspan>
        </text>
    </g>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,349.35,871.5)" stroke-linecap="round" id="103" fill="none" ed:tosuperid="102" stroke-linejoin="round" ed:parentid="101" d="M67.5,443.2L99,443.2L99,-443.2L130.4,-443.2"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,580.3,269.58)" stroke-linecap="round" id="106" fill="none" ed:tosuperid="105" stroke-linejoin="round" ed:parentid="102" d="M-13.5,158.7L0,158.7L0,-158.7L13.5,-158.7"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,865.3,86.37)" stroke-linecap="round" id="108" fill="none" ed:tosuperid="107" stroke-linejoin="round" ed:parentid="105" d="M-13.5,24.5L0,24.5L0,-24.5L13.5,-24.5"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,865.3,111.42)" stroke-linecap="round" id="111" fill="none" ed:tosuperid="110" stroke-linejoin="round" ed:parentid="105" d="M0,-0.6L0,0.6L13.5,0.6"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,865.3,135.36)" stroke-linecap="round" id="114" fill="none" ed:tosuperid="113" stroke-linejoin="round" ed:parentid="105" d="M0,-24.5L0,24.5L13.5,24.5"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,580.3,310.48)" stroke-linecap="round" id="117" fill="none" ed:tosuperid="116" stroke-linejoin="round" ed:parentid="102" d="M0,117.8L0,-117.8L13.5,-117.8"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,675.7,192.66)" stroke-linecap="round" id="119" fill="none" ed:tosuperid="118" stroke-linejoin="round" ed:parentid="116" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,580.3,363.88)" stroke-linecap="round" id="121" fill="none" ed:tosuperid="120" stroke-linejoin="round" ed:parentid="102" d="M0,64.4L0,-64.4L13.5,-64.4"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,675.7,271.01)" stroke-linecap="round" id="123" fill="none" ed:tosuperid="122" stroke-linejoin="round" ed:parentid="120" d="M-13.5,28.5L0,28.5L0,-28.5L13.5,-28.5"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,675.7,295.35)" stroke-linecap="round" id="126" fill="none" ed:tosuperid="125" stroke-linejoin="round" ed:parentid="120" d="M0,4.1L0,-4.1L13.5,-4.1"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,675.7,327.92)" stroke-linecap="round" id="129" fill="none" ed:tosuperid="128" stroke-linejoin="round" ed:parentid="120" d="M0,-28.5L0,28.5L13.5,28.5"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,580.3,420.52)" stroke-linecap="round" id="132" fill="none" ed:tosuperid="131" stroke-linejoin="round" ed:parentid="102" d="M0,7.8L0,-7.8L13.5,-7.8"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,665.3,412.74)" stroke-linecap="round" id="134" fill="none" ed:tosuperid="133" stroke-linejoin="round" ed:parentid="131" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,580.3,456.82)" stroke-linecap="round" id="137" fill="none" ed:tosuperid="136" stroke-linejoin="round" ed:parentid="102" d="M0,-28.5L0,28.5L13.5,28.5"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,705.3,468.94)" stroke-linecap="round" id="139" fill="none" ed:tosuperid="138" stroke-linejoin="round" ed:parentid="136" d="M-13.5,16.4L0,16.4L0,-16.4L13.5,-16.4"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,705.3,485.34)" stroke-linecap="round" id="141" fill="none" ed:tosuperid="140" stroke-linejoin="round" ed:parentid="136" d="M0,0L13.5,0"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,846.3,485.34)" stroke-linecap="round" id="143" fill="none" ed:tosuperid="142" stroke-linejoin="round" ed:parentid="140" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,705.3,501.74)" stroke-linecap="round" id="145" fill="none" ed:tosuperid="144" stroke-linejoin="round" ed:parentid="136" d="M0,-16.4L0,16.4L13.5,16.4"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,807.9,518.14)" stroke-linecap="round" id="147" fill="none" ed:tosuperid="146" stroke-linejoin="round" ed:parentid="144" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,580.3,587.01)" stroke-linecap="round" id="149" fill="none" ed:tosuperid="148" stroke-linejoin="round" ed:parentid="102" d="M0,-158.7L0,158.7L13.5,158.7"/>
    <path stroke="#fa8155" transform="matrix(1,0,0,1,765.3,745.72)" stroke-linecap="round" id="151" fill="none" ed:tosuperid="150" stroke-linejoin="round" ed:parentid="148" d="M-13.5,-0L0,-0L13.5,0"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,349.35,1206.09)" stroke-linecap="round" id="154" fill="none" ed:tosuperid="153" stroke-linejoin="round" ed:parentid="101" d="M67.5,108.6L99,108.6L99,-108.6L130.4,-108.6"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,700.3,959.44)" stroke-linecap="round" id="158" fill="none" ed:tosuperid="157" stroke-linejoin="round" ed:parentid="153" d="M-13.5,138L0,138L0,-138L13.5,-138"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,785.3,813.22)" stroke-linecap="round" id="160" fill="none" ed:tosuperid="159" stroke-linejoin="round" ed:parentid="157" d="M-13.5,8.2L0,8.2L0,-8.2L13.5,-8.2"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,785.3,829.62)" stroke-linecap="round" id="162" fill="none" ed:tosuperid="161" stroke-linejoin="round" ed:parentid="157" d="M0,-8.2L0,8.2L13.5,8.2"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,700.3,1032.88)" stroke-linecap="round" id="164" fill="none" ed:tosuperid="163" stroke-linejoin="round" ed:parentid="153" d="M0,64.6L0,-64.6L13.5,-64.6"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,785.3,929.23)" stroke-linecap="round" id="166" fill="none" ed:tosuperid="165" stroke-linejoin="round" ed:parentid="163" d="M-13.5,39.1L0,39.1L0,-39.1L13.5,-39.1"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,785.3,955.35)" stroke-linecap="round" id="169" fill="none" ed:tosuperid="168" stroke-linejoin="round" ed:parentid="163" d="M0,12.9L0,-12.9L13.5,-12.9"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,785.3,981.56)" stroke-linecap="round" id="172" fill="none" ed:tosuperid="171" stroke-linejoin="round" ed:parentid="163" d="M0,-13.3L0,13.3L13.5,13.3"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,785.3,1007.37)" stroke-linecap="round" id="175" fill="none" ed:tosuperid="174" stroke-linejoin="round" ed:parentid="163" d="M0,-39.1L0,39.1L13.5,39.1"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,700.3,1105.67)" stroke-linecap="round" id="178" fill="none" ed:tosuperid="177" stroke-linejoin="round" ed:parentid="153" d="M0,-8.2L0,8.2L13.5,8.2"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,895.7,1105.68)" stroke-linecap="round" id="180" fill="none" ed:tosuperid="179" stroke-linejoin="round" ed:parentid="177" d="M-13.5,8.2L0,8.2L0,-8.2L13.5,-8.2"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,895.7,1122.08)" stroke-linecap="round" id="183" fill="none" ed:tosuperid="182" stroke-linejoin="round" ed:parentid="177" d="M0,-8.2L0,8.2L13.5,8.2"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,700.3,1180.69)" stroke-linecap="round" id="185" fill="none" ed:tosuperid="184" stroke-linejoin="round" ed:parentid="153" d="M0,-83.2L0,83.2L13.5,83.2"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,895.7,1263.93)" stroke-linecap="round" id="187" fill="none" ed:tosuperid="186" stroke-linejoin="round" ed:parentid="184" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,700.3,1206.56)" stroke-linecap="round" id="190" fill="none" ed:tosuperid="189" stroke-linejoin="round" ed:parentid="153" d="M0,-109.1L0,109.1L13.5,109.1"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,895.7,1315.66)" stroke-linecap="round" id="192" fill="none" ed:tosuperid="191" stroke-linejoin="round" ed:parentid="189" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,700.3,1235.48)" stroke-linecap="round" id="195" fill="none" ed:tosuperid="194" stroke-linejoin="round" ed:parentid="153" d="M0,-138L0,138L13.5,138"/>
    <path stroke="#ffad36" transform="matrix(1,0,0,1,926.9,1373.5)" stroke-linecap="round" id="197" fill="none" ed:tosuperid="196" stroke-linejoin="round" ed:parentid="194" d="M-13.5,-0L0,-0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,349.35,1518.58)" stroke-linecap="round" id="201" fill="none" ed:tosuperid="200" stroke-linejoin="round" ed:parentid="101" d="M67.5,-203.9L99,-203.9L99,203.9L130.4,203.9"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1581.13)" stroke-linecap="round" id="203" fill="none" ed:tosuperid="202" stroke-linejoin="round" ed:parentid="200" d="M-13.5,141.3L0,141.3L0,-141.3L13.5,-141.3"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,803.7,1439.8)" stroke-linecap="round" id="205" fill="none" ed:tosuperid="204" stroke-linejoin="round" ed:parentid="202" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1683.38)" stroke-linecap="round" id="207" fill="none" ed:tosuperid="206" stroke-linejoin="round" ed:parentid="200" d="M0,39.1L0,-39.1L13.5,-39.1"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,933.3,1597.05)" stroke-linecap="round" id="209" fill="none" ed:tosuperid="208" stroke-linejoin="round" ed:parentid="206" d="M-13.5,47.3L0,47.3L0,-47.3L13.5,-47.3"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,1055.1,1549.8)" stroke-linecap="round" id="211" fill="none" ed:tosuperid="210" stroke-linejoin="round" ed:parentid="208" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,1301.1,1549.8)" stroke-linecap="round" id="214" fill="none" ed:tosuperid="213" stroke-linejoin="round" ed:parentid="210" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,933.3,1644.55)" stroke-linecap="round" id="217" fill="none" ed:tosuperid="216" stroke-linejoin="round" ed:parentid="206" d="M0,-0.3L13.5,0.3"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,1093.5,1644.8)" stroke-linecap="round" id="219" fill="none" ed:tosuperid="218" stroke-linejoin="round" ed:parentid="216" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,1353.5,1644.8)" stroke-linecap="round" id="222" fill="none" ed:tosuperid="221" stroke-linejoin="round" ed:parentid="218" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,933.3,1691.55)" stroke-linecap="round" id="225" fill="none" ed:tosuperid="224" stroke-linejoin="round" ed:parentid="206" d="M0,-47.3L0,47.3L13.5,47.3"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,1055.1,1738.8)" stroke-linecap="round" id="227" fill="none" ed:tosuperid="226" stroke-linejoin="round" ed:parentid="224" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,1458.1,1738.8)" stroke-linecap="round" id="230" fill="none" ed:tosuperid="229" stroke-linejoin="round" ed:parentid="226" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1755.77)" stroke-linecap="round" id="233" fill="none" ed:tosuperid="232" stroke-linejoin="round" ed:parentid="200" d="M0,-33.3L0,33.3L13.5,33.3"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,753.3,1789.09)" stroke-linecap="round" id="235" fill="none" ed:tosuperid="234" stroke-linejoin="round" ed:parentid="232" d="M-13.5,-0L0,-0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1772.17)" stroke-linecap="round" id="238" fill="none" ed:tosuperid="237" stroke-linejoin="round" ed:parentid="200" d="M0,-49.7L0,49.7L13.5,49.7"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,733.3,1821.89)" stroke-linecap="round" id="240" fill="none" ed:tosuperid="239" stroke-linejoin="round" ed:parentid="237" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1798.97)" stroke-linecap="round" id="242" fill="none" ed:tosuperid="241" stroke-linejoin="round" ed:parentid="200" d="M0,-76.5L0,76.5L13.5,76.5"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,833.3,1875.49)" stroke-linecap="round" id="244" fill="none" ed:tosuperid="243" stroke-linejoin="round" ed:parentid="241" d="M-13.5,0L0,0L13.5,-0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1839.46)" stroke-linecap="round" id="246" fill="none" ed:tosuperid="245" stroke-linejoin="round" ed:parentid="200" d="M0,-117L0,117L13.5,117"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,934.1,1956.46)" stroke-linecap="round" id="248" fill="none" ed:tosuperid="247" stroke-linejoin="round" ed:parentid="245" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,628.3,1863.78)" stroke-linecap="round" id="251" fill="none" ed:tosuperid="250" stroke-linejoin="round" ed:parentid="200" d="M0,-141.3L0,141.3L13.5,141.3"/>
    <path stroke="#b7c82b" transform="matrix(1,0,0,1,843.7,2005.11)" stroke-linecap="round" id="253" fill="none" ed:tosuperid="252" stroke-linejoin="round" ed:parentid="250" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,349.35,1757.92)" stroke-linecap="round" id="256" fill="none" ed:tosuperid="255" stroke-linejoin="round" ed:parentid="101" d="M67.5,-443.2L99,-443.2L99,443.2L130.4,443.2"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,748.3,2141.84)" stroke-linecap="round" id="259" fill="none" ed:tosuperid="258" stroke-linejoin="round" ed:parentid="255" d="M-13.5,59.3L0,59.3L0,-59.3L13.5,-59.3"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,1043.7,2082.54)" stroke-linecap="round" id="261" fill="none" ed:tosuperid="260" stroke-linejoin="round" ed:parentid="258" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,748.3,2167.44)" stroke-linecap="round" id="264" fill="none" ed:tosuperid="263" stroke-linejoin="round" ed:parentid="255" d="M0,33.7L0,-33.7L13.5,-33.7"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,963.7,2133.75)" stroke-linecap="round" id="266" fill="none" ed:tosuperid="265" stroke-linejoin="round" ed:parentid="263" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,748.3,2201.59)" stroke-linecap="round" id="269" fill="none" ed:tosuperid="268" stroke-linejoin="round" ed:parentid="255" d="M0,-0.5L13.5,0.5"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,963.7,2193.85)" stroke-linecap="round" id="271" fill="none" ed:tosuperid="270" stroke-linejoin="round" ed:parentid="268" d="M-13.5,8.2L0,8.2L0,-8.2L13.5,-8.2"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,963.7,2210.25)" stroke-linecap="round" id="274" fill="none" ed:tosuperid="273" stroke-linejoin="round" ed:parentid="268" d="M0,-8.2L0,8.2L13.5,8.2"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,748.3,2240.52)" stroke-linecap="round" id="276" fill="none" ed:tosuperid="275" stroke-linejoin="round" ed:parentid="255" d="M0,-39.4L0,39.4L13.5,39.4"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,1044.5,2279.91)" stroke-linecap="round" id="278" fill="none" ed:tosuperid="277" stroke-linejoin="round" ed:parentid="275" d="M-13.5,0L0,0L13.5,0"/>
    <path stroke="#0098b9" transform="matrix(1,0,0,1,748.3,2260.42)" stroke-linecap="round" id="281" fill="none" ed:tosuperid="280" stroke-linejoin="round" ed:parentid="255" d="M0,-59.3L0,59.3L13.5,59.3"/>
    <g transform="matrix(1,0,0,1,21,1278.11)" ed:layout="rightmap" id="101" ed:topictype="mainidea" ed:height="73.2" ed:width="395.8">
        <path stroke="#ef6c70" fill="none" stroke-linejoin="round" d="M4,0L391.8,0C394.5,0,395.8,1.3,395.8,4L395.8,69.2C395.8,71.9,394.5,73.2,391.8,73.2L4,73.2C1.3,73.2,0,71.9,0,69.2L0,4C0,1.3,1.3,0,4,0z"/>
        <text class="st2">
            <tspan style="white-space:pre" x="20" y="53.1">第一章实数集与函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,479.8,406.69)" id="102" ed:parentid="101" ed:height="43.2" ed:width="87">
        <text class="st3">
            <tspan style="white-space:pre" x="18" y="32.5">实数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,593.8,84.57)" id="105" ed:parentid="102" ed:height="26.3" ed:width="258">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L258,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">将实数统一表示为无限小数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,878.8,19)" id="107" ed:parentid="105" ed:height="42.8689" ed:width="509">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,42.9L509,42.9"/>
        <use transform="translate(7,2)" xlink:href="#image1" x="0" y="0" width="495" height="37"/>
    </g>
    <symbol id="image1">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,878.8,68.37)" id="110" ed:parentid="105" ed:height="43.5989" ed:width="328">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,43.6L328,43.6"/>
        <use transform="translate(7,2)" xlink:href="#image2" x="0" y="0" width="314" height="38"/>
    </g>
    <symbol id="image2">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,878.8,118.47)" id="113" ed:parentid="105" ed:height="41.3948" ed:width="136">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,41.4L136,41.4"/>
        <use transform="translate(7,2)" xlink:href="#image3" x="0" y="0" width="122" height="36"/>
    </g>
    <symbol id="image3">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,593.8,166.36)" id="116" ed:parentid="102" ed:height="26.3" ed:width="68.40000000000001">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L68.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义1</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,689.2,166.36)" id="118" ed:parentid="116" ed:height="26.3" ed:width="171.6">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L171.6,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">非负实数比较大小</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,593.8,273.17)" id="120" ed:parentid="102" ed:height="26.3" ed:width="68.40000000000001">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L68.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义2</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,689.2,199.16)" id="122" ed:parentid="120" ed:height="43.3977" ed:width="324">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,43.4L324,43.4"/>
        <use transform="translate(7,2)" xlink:href="#image4" x="0" y="0" width="310" height="38"/>
    </g>
    <symbol id="image4">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,689.2,249.06)" id="125" ed:parentid="120" ed:height="42.1739" ed:width="257">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,42.2L257,42.2"/>
        <use transform="translate(7,2)" xlink:href="#image5" x="0" y="0" width="243" height="37"/>
    </g>
    <symbol id="image5">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,689.2,297.73)" id="128" ed:parentid="120" ed:height="58.6428" ed:width="215">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,58.6L215,58.6"/>
        <use transform="translate(7,2)" xlink:href="#image6" x="0" y="0" width="201" height="53"/>
    </g>
    <symbol id="image6">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,593.8,386.44)" id="131" ed:parentid="102" ed:height="26.3" ed:width="58">
        <path fill="#ff3c00" d="M0,0L58,0L58,26.3L0,26.3L0,0z"/>
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L58,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">命题</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,678.8,369.88)" id="133" ed:parentid="131" ed:height="42.8606" ed:width="784">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,42.9L784,42.9"/>
        <use transform="translate(7,2)" xlink:href="#image7" x="0" y="0" width="770" height="37"/>
    </g>
    <symbol id="image7">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,593.8,459.04)" id="136" ed:parentid="102" ed:height="26.3" ed:width="98">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L98,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">实数性质</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,718.8,426.24)" id="138" ed:parentid="136" ed:height="26.3" ed:width="382.8">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L382.8,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">四则运算封闭性、大小有序性、大小传递性</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,718.8,459.04)" id="140" ed:parentid="136" ed:height="26.3" ed:width="114">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L114,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">阿基米德性</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,859.8,459.04)" id="142" ed:parentid="140" ed:height="26.3" ed:width="238.8">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L238.8,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">b>a>0,则存在n>0使得na>b</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,718.8,491.84)" id="144" ed:parentid="136" ed:height="26.3" ed:width="75.59999999999999">
        <path fill="#e32c2d" d="M0,0L75.6,0L75.6,26.3L0,26.3L0,0z"/>
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L75.6,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="7" y="21.5">稠密性</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,821.4,491.84)" id="146" ed:parentid="144" ed:height="26.3" ed:width="402">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L402,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">任两个不相等的实数之间一定存在另一个实数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,593.8,719.42)" id="148" ed:parentid="102" ed:height="26.3" ed:width="158">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,26.3L158,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">绝对值与不等式</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,778.8,524.64)" id="150" ed:parentid="148" ed:height="221.084" ed:width="614">
        <path stroke="#fa8155" fill="none" stroke-linejoin="round" d="M0,221.1L614,221.1"/>
        <use transform="translate(7,2)" xlink:href="#image8" x="0" y="0" width="600" height="216"/>
    </g>
    <symbol id="image8">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,479.8,1075.86)" id="153" ed:parentid="101" ed:height="43.2" ed:width="207">
        <text class="st3">
            <tspan style="white-space:pre" x="18" y="32.5">数集·确界原理</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,713.8,795.12)" id="157" ed:parentid="153" ed:height="26.3" ed:width="58">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L58,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">区间</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,798.8,778.72)" id="159" ed:parentid="157" ed:height="26.3" ed:width="450">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L450,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">开区间（a,b）、闭区间[a,b]、半开半闭区间(a,b]</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,798.8,811.52)" id="161" ed:parentid="157" ed:height="26.3" ed:width="190.8">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L190.8,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">有限区间、无限区间</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,713.8,942)" id="163" ed:parentid="153" ed:height="26.3" ed:width="58">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L58,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">邻域</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,798.8,844.32)" id="165" ed:parentid="163" ed:height="45.8361" ed:width="488">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,45.8L488,45.8"/>
        <use transform="translate(7,2)" xlink:href="#image9" x="0" y="0" width="474" height="40"/>
    </g>
    <symbol id="image9">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,798.8,896.66)" id="168" ed:parentid="163" ed:height="45.7483" ed:width="427">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,45.7L427,45.7"/>
        <use transform="translate(7,2)" xlink:href="#image10" x="0" y="0" width="413" height="40"/>
    </g>
    <symbol id="image10">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,798.8,948.91)" id="171" ed:parentid="163" ed:height="45.9292" ed:width="884">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,45.9L884,45.9"/>
        <use transform="translate(7,2)" xlink:href="#image11" x="0" y="0" width="870" height="40"/>
    </g>
    <symbol id="image11">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,798.8,1001.33)" id="174" ed:parentid="163" ed:height="45.103" ed:width="1114">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,45.1L1114,45.1"/>
        <use transform="translate(7,2)" xlink:href="#image12" x="0" y="0" width="1100" height="40"/>
    </g>
    <symbol id="image12">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,713.8,1087.58)" id="177" ed:parentid="153" ed:height="26.3" ed:width="168.4">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L168.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义1（上下界）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,909.2,1052.94)" id="179" ed:parentid="177" ed:height="44.5423" ed:width="1175">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,44.5L1175,44.5"/>
        <use transform="translate(7,2)" xlink:href="#image13" x="0" y="0" width="1161" height="39"/>
    </g>
    <symbol id="image13">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,909.2,1103.98)" id="182" ed:parentid="177" ed:height="26.3" ed:width="469.2">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L469.2,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">数集S既有上界又有下界，则为有界集，反之为无界集</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,713.8,1237.63)" id="184" ed:parentid="153" ed:height="26.3" ed:width="168.4">
        <path fill="#ff3c00" d="M0,0L168.4,0L168.4,26.3L0,26.3L0,0z"/>
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L168.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义2（上确界）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,909.2,1136.78)" id="186" ed:parentid="184" ed:height="127.149" ed:width="610">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,127.1L610,127.1"/>
        <use transform="translate(7,2)" xlink:href="#image14" x="0" y="0" width="596" height="122"/>
    </g>
    <symbol id="image14">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,713.8,1289.36)" id="189" ed:parentid="153" ed:height="26.3" ed:width="168.4">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L168.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义3（下确界）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,909.2,1270.42)" id="191" ed:parentid="189" ed:height="45.2337" ed:width="316">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,45.2L316,45.2"/>
        <use transform="translate(7,2)" xlink:href="#image15" x="0" y="0" width="302" height="40"/>
    </g>
    <symbol id="image15">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,713.8,1347.2)" id="194" ed:parentid="153" ed:height="26.3" ed:width="199.6">
        <path fill="#ff3c00" d="M0,0L199.6,0L199.6,26.3L0,26.3L0,0z"/>
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,26.3L199.6,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定理1.1(确界定理）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,940.4,1329.16)" id="196" ed:parentid="194" ed:height="44.341" ed:width="643">
        <path stroke="#ffad36" fill="none" stroke-linejoin="round" d="M0,44.3L643,44.3"/>
        <use transform="translate(7,2)" xlink:href="#image16" x="0" y="0" width="629" height="39"/>
    </g>
    <symbol id="image16">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,1545.2,1210.82)" ed:layout="rightmap" id="199" ed:parentid="156" ed:height="30.8" ed:width="113">
        <path fill="#f8f7f7" d="M0,0L113,0L113,30.8L0,30.8L0,0z"/>
        <text class="st6">
            <tspan style="white-space:pre" x="7" y="23.9">统称为确界</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,479.8,1700.86)" id="200" ed:parentid="101" ed:height="43.2" ed:width="135">
        <text class="st3">
            <tspan style="white-space:pre" x="18" y="32.5">函数概念</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,641.8,1413.5)" id="202" ed:parentid="200" ed:height="26.3" ed:width="148.4">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L148.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义1（函数）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,817.2,1413.5)" id="204" ed:parentid="202" ed:height="26.3" ed:width="229.2">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L229.2,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">实质是集合到集合的映射</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,641.8,1618)" id="206" ed:parentid="200" ed:height="26.3" ed:width="278">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L278,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">函数表示（三个特殊的函数）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,946.8,1523.5)" id="208" ed:parentid="206" ed:height="26.3" ed:width="94.8">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L94.8,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">符号函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,1068.6,1449.3)" id="210" ed:parentid="208" ed:height="100.5" ed:width="219">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,100.5L219,100.5"/>
        <use transform="translate(7,2)" xlink:href="#image17" x="0" y="0" width="205" height="95"/>
    </g>
    <symbol id="image17">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,1314.6,1446.3)" id="213" ed:parentid="210" ed:height="103.5" ed:width="142">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,103.5L142,103.5"/>
        <use transform="translate(7,2)" xlink:href="#image18" x="0" y="0" width="128" height="98"/>
    </g>
    <symbol id="image18">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,946.8,1618.5)" id="216" ed:parentid="206" ed:height="26.3" ed:width="133.2">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L133.2,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="7" y="21.5">狄利克雷函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,1107,1577.44)" id="218" ed:parentid="216" ed:height="67.35809999999999" ed:width="233">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,67.4L233,67.4"/>
        <use transform="translate(7,2)" xlink:href="#image19" x="0" y="0" width="219" height="62"/>
    </g>
    <symbol id="image19">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,1367,1556.3)" id="221" ed:parentid="218" ed:height="88.5" ed:width="129">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,88.5L129,88.5"/>
        <use transform="translate(7,2)" xlink:href="#image20" x="0" y="0" width="115" height="83"/>
    </g>
    <symbol id="image20">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,946.8,1712.5)" id="224" ed:parentid="206" ed:height="26.3" ed:width="94.8">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L94.8,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">黎曼函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,1068.6,1665.66)" id="226" ed:parentid="224" ed:height="73.15049999999999" ed:width="376">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,73.2L376,73.2"/>
        <use transform="translate(7,2)" xlink:href="#image21" x="0" y="0" width="362" height="68"/>
    </g>
    <symbol id="image21">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,1471.6,1651.3)" id="229" ed:parentid="226" ed:height="87.5" ed:width="137">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,87.5L137,87.5"/>
        <use transform="translate(7,2)" xlink:href="#image22" x="0" y="0" width="123" height="82"/>
    </g>
    <symbol id="image22">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,641.8,1762.79)" id="232" ed:parentid="200" ed:height="26.3" ed:width="98">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L98,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">复合函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,766.8,1745.31)" id="234" ed:parentid="232" ed:height="43.7855" ed:width="385">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,43.8L385,43.8"/>
        <use transform="translate(7,2)" xlink:href="#image23" x="0" y="0" width="371" height="38"/>
    </g>
    <symbol id="image23">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,641.8,1795.59)" id="237" ed:parentid="200" ed:height="26.3" ed:width="78">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L78,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">反函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,746.8,1795.59)" id="239" ed:parentid="237" ed:height="26.3" ed:width="75.59999999999999">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L75.6,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="7" y="21.5">逆映射</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,641.8,1849.19)" id="241" ed:parentid="200" ed:height="26.3" ed:width="178">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L178,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">初等函数（六类）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,846.8,1828.39)" id="243" ed:parentid="241" ed:height="47.1" ed:width="514">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,47.1L514,47.1"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.6">常量函数、幂函数、指数函数、对数函数、三角函数、反</tspan>
            <tspan style="white-space:pre" x="8" y="42.3">三角函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,641.8,1930.16)" id="245" ed:parentid="200" ed:height="26.3" ed:width="278.8">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L278.8,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义2（幂函数x为无理数时）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,947.6,1881.99)" id="247" ed:parentid="245" ed:height="74.46899999999999" ed:width="446">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,74.5L446,74.5"/>
        <use transform="translate(7,2)" xlink:href="#image24" x="0" y="0" width="432" height="69"/>
    </g>
    <symbol id="image24">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,641.8,1978.81)" id="250" ed:parentid="200" ed:height="26.3" ed:width="188.4">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,26.3L188.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义3（初等函数）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,857.2,1962.95)" id="252" ed:parentid="250" ed:height="42.1551" ed:width="456">
        <path stroke="#b7c82b" fill="none" stroke-linejoin="round" d="M0,42.2L456,42.2"/>
        <use transform="translate(7,2)" xlink:href="#image25" x="0" y="0" width="442" height="37"/>
    </g>
    <symbol id="image25">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,479.8,2179.53)" id="255" ed:parentid="101" ed:height="43.2" ed:width="255">
        <text class="st3">
            <tspan style="white-space:pre" x="18" y="32.5">具有某些特性的函数</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,761.8,2056.24)" id="258" ed:parentid="255" ed:height="26.3" ed:width="268.4">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,26.3L268.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="7" y="21.5">定义1（有上（下）界函数）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,1057.2,2038.12)" id="260" ed:parentid="258" ed:height="44.43" ed:width="204">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,44.4L204,44.4"/>
        <use transform="translate(7,2)" xlink:href="#image26" x="0" y="0" width="190" height="39"/>
    </g>
    <symbol id="image26">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,761.8,2107.45)" id="263" ed:parentid="255" ed:height="26.3" ed:width="188.4">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,26.3L188.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义2（有界函数）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,977.2,2089.05)" id="265" ed:parentid="263" ed:height="44.7076" ed:width="127">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,44.7L127,44.7"/>
        <use transform="translate(7,2)" xlink:href="#image27" x="0" y="0" width="113" height="39"/>
    </g>
    <symbol id="image27">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,761.8,2175.75)" id="268" ed:parentid="255" ed:height="26.3" ed:width="188.4">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,26.3L188.4,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定义3（单调函数）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,977.2,2140.25)" id="270" ed:parentid="268" ed:height="45.4016" ed:width="552">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,45.4L552,45.4"/>
        <use transform="translate(7,2)" xlink:href="#image28" x="0" y="0" width="538" height="40"/>
    </g>
    <symbol id="image28">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,977.2,2192.15)" id="273" ed:parentid="268" ed:height="26.3" ed:width="229.2">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,26.3L229.2,26.3"/>
        <text class="st5">
            <tspan style="white-space:pre" x="8" y="21.5">（严格）减函数与上同理</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,761.8,2253.61)" id="275" ed:parentid="255" ed:height="26.3" ed:width="269.2">
        <path fill="#ff3c00" d="M0,0L269.2,0L269.2,26.3L0,26.3L0,0z"/>
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,26.3L269.2,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">定理1.2（反函数保单调性）</tspan>
        </text>
    </g>
    <g transform="matrix(1,0,0,1,1058,2231.95)" id="277" ed:parentid="275" ed:height="47.9633" ed:width="910">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,48L910,48"/>
        <use transform="translate(7,2)" xlink:href="#image29" x="0" y="0" width="896" height="42"/>
    </g>
    <symbol id="image29">
        <image xlink:href="" width="100%" height="100%" preserveAspectRatio="none"/>
    </symbol>
    <g transform="matrix(1,0,0,1,761.8,2293.41)" id="280" ed:parentid="255" ed:height="26.3" ed:width="258">
        <path stroke="#0098b9" fill="none" stroke-linejoin="round" d="M0,26.3L258,26.3"/>
        <text class="st4">
            <tspan style="white-space:pre" x="8" y="21.5">奇函数、偶函数、周期函数</tspan>
        </text>
    </g>
</svg>
</div>
        <div id="copyright">Created With  <a href="https://www.edrawsoft.com/" target="_blank" title="edrawsoft">MindMaster</a></div>
      </div>
    </div>
    <script>eval(atob('dmFyIG11YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Ow0KdmFyIHVhID0gKG11YS5pbmRleE9mKCdydjoxMScpICsgbXVhLmluZGV4T2YoJ01TSUUnKSkgPj0gMDsNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmctY29udGFpbmVyJykub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uIChldmVudCkgew0KICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQp9DQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZnLWNvbnRhaW5lcicpLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgaWYgKGV2ZW50LndoaWNoID09IDMpIHsNCiAgICAgICAgdGhpcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7DQogICAgICAgIHRoaXMub25tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZXYpIHsNCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQnkoLShldi5tb3ZlbWVudFgpLCAwKTsNCiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxCeSgwLCAtKGV2Lm1vdmVtZW50WSkpDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5vbm1vdXNldXAgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmN1cnNvciA9IG51bGw7DQogICAgICAgICAgICB0aGlzLm9ubW91c2V1cCA9IG51bGw7DQogICAgICAgICAgICB0aGlzLm9ubW91c2Vtb3ZlID0gbnVsbDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCk51bWJlci5wcm90b3R5cGUudG9zdWl0c3ZnID0gZnVuY3Rpb24gKCkgew0KICAgIHZhciBudW0gPSB0aGlzLnZhbHVlT2YoKTsNCiAgICBpZiAobnVtICUgMSA9PT0gMCkgew0KICAgICAgICByZXR1cm4gbnVtICsgMC41DQogICAgfSBlbHNlIHJldHVybiBudW07DQp9Ow0KTnVtYmVyLnByb3RvdHlwZS5wbHVzeiA9IGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbnVtID0gdGhpcy52YWx1ZU9mKCk7DQogICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtOw0KfTsNCmZ1bmN0aW9uIHBhcnNlRGF0ZShudW0pIHsNCiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKG51bSk7DQogICAgdmFyIFkgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyAnLSc7DQogICAgdmFyIE0gPSAoZGF0ZS5nZXRNb250aCgpICsgMSkucGx1c3ooKSArICctJzsNCiAgICB2YXIgRCA9IGRhdGUuZ2V0RGF0ZSgpLnBsdXN6KCkgKyAnICc7DQogICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKCkucGx1c3ooKSArICc6JzsNCiAgICB2YXIgbW0gPSBkYXRlLmdldE1pbnV0ZXMoKS5wbHVzeigpICsgJzonOw0KICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCkucGx1c3ooKTsNCiAgICByZXR1cm4gWSArIE0gKyBEICsgaCArIG1tICsgczsNCn0NCi8vLS1wcmVkZWZpbmVkDQovL2NvbW1lbnQtLQ0KDQpmdW5jdGlvbiBnZXRjd2gocG9wdXApIHsNCiAgICBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKVswXS5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgdmFyIHcgPSBwb3B1cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICB2YXIgaCA9IHBvcHVwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsNCiAgICByZXR1cm4gW3csIGhdDQp9DQpzdmdFbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN2ZyIpOw0KZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBzdmdFbGVtcy5sZW5ndGg7IGluZGV4KyspIHsNCiAgICAvLyB2YXIgY29tbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdmc6bnRoLWNoaWxkKCcgKyBpbmRleCArICcpIGc+Z1tlZFxcOmNvbW1lbnRdJyk7DQogICAgdmFyIGNvbW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgc3ZnOm50aC1jaGlsZCgke2luZGV4fSkgZz5nW2VkXFw6Y29tbWVudF1gKTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpOw0KICAgICAgICB2YXIgcG9wdXBSID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgIHZhciBob3ZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOw0KICAgICAgICB2YXIgb2xpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3JlY3QnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCdmaWxsJywgJyNjZGNkZmYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd4JywgJzAnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd5JywgJzAnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxNicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBjb21tZW50c1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpKTsNCiAgICAgICAgaG92ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgY29tbWVudHNbaV0uYXBwZW5kQ2hpbGQoaG92ZXIpOw0KICAgICAgICB2YXIgYSA9IEpTT04ucGFyc2UoY29tbWVudHNbaV0uZ2V0QXR0cmlidXRlKCdlZDpjb21tZW50JykpOw0KICAgICAgICB2YXIgaGVpZ2h0ID0gMDsNCiAgICAgICAgdmFyIGNhcnIgPSBbXTsNCiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICB2YXIgc3RhbXAgPSBOdW1iZXIoYVtqXS5EYXRlKSAqIDEwMDA7DQogICAgICAgICAgICB2YXIgdGltZSA9IHBhcnNlRGF0ZShzdGFtcCk7DQogICAgICAgICAgICB2YXIgbmFtZSA9IGFbal0uTmFtZTsNCiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gYVtqXS5NZXNzYWdlOw0KICAgICAgICAgICAgdmFyIG1lc3NhZ2VBcnIgPSBtZXNzYWdlLnNwbGl0KC9cbi8pOw0KICAgICAgICAgICAgdmFyIG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTsNCiAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICd0ZXh0Jyk7DQogICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndGV4dCcpOw0KICAgICAgICAgICAgdmFyIG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3RleHQnKTsNCiAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKCd4JywgNSk7DQogICAgICAgICAgICBuLnNldEF0dHJpYnV0ZSgneScsIDEyKTsNCiAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKCdmaWxsJywgJyMwMDZlZmYnKTsNCiAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSBuYW1lICsgJzogJzsNCiAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCAnMTInKTsNCiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKCd4JywgMjAwKTsNCiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKCd5JywgMTIpOw0KICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnIzk2OTY5NicpOw0KICAgICAgICAgICAgdC50ZXh0Q29udGVudCA9IHRpbWU7DQogICAgICAgICAgICB0LnNldEF0dHJpYnV0ZSgnZm9udC1zaXplJywgJzEwJyk7DQogICAgICAgICAgICBtLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgyMCwyNyknKTsNCiAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCAnMTInKTsNCiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWVzc2FnZUFyci5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgIHZhciB0cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndHNwYW4nKTsNCiAgICAgICAgICAgICAgICB0cy5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpOw0KICAgICAgICAgICAgICAgIHRzLnNldEF0dHJpYnV0ZSgneScsIGsgKiAxNik7DQogICAgICAgICAgICAgICAgdHMudGV4dENvbnRlbnQgPSBtZXNzYWdlQXJyW2tdOw0KICAgICAgICAgICAgICAgIG0uYXBwZW5kQ2hpbGQodHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgby5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwnICsgaGVpZ2h0ICsgJyknKTsNCiAgICAgICAgICAgIG8uYXBwZW5kQ2hpbGQobik7DQogICAgICAgICAgICBvLmFwcGVuZENoaWxkKHQpOw0KICAgICAgICAgICAgby5hcHBlbmRDaGlsZChtKTsNCiAgICAgICAgICAgIGNhcnIucHVzaChvKTsNCiAgICAgICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKG8pOw0KICAgICAgICAgICAgaGVpZ2h0ID0gKG1lc3NhZ2VBcnIubGVuZ3RoICsgMSkgKiAxNiArIGhlaWdodDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgd2FyciA9IGdldGN3aChwb3B1cCk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneCcsICcwJyk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneScsICcwJyk7DQogICAgICAgIHZhciBvdyA9IHdhcnJbMF0gKyAxMC41Ow0KICAgICAgICB2YXIgb2ggPSB3YXJyWzFdICsgMzsNCiAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIG93KTsNCiAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBvaCk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgnZmlsbCcsICd3aGl0ZScpOw0KICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjNjU2NTY1Jyk7DQogICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKG9saW5lKTsNCiAgICAgICAgdmFyIGwgPSBjYXJyLmxlbmd0aDsNCiAgICAgICAgd2hpbGUgKGwtLSkgew0KICAgICAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQoY2FycltsXSk7DQogICAgICAgIH0NCiAgICAgICAgcG9wdXAub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB9Ow0KICAgICAgICBwb3B1cC5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICB9Ow0KICAgICAgICB2YXIgY3MgPSBjb21tZW50c1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpLm1hdGNoKC9cKChcUyp8XFMqXHNcUyopXCkvKVsxXS5zcGxpdCgvIHwsLyk7DQogICAgICAgIHZhciBwcyA9IGNvbW1lbnRzW2ldLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTsNCiAgICAgICAgaWYgKHBzLnN1YnN0cigwLCAyKSA9PSAndHInKSB7DQogICAgICAgICAgICB2YXIgcHBzID0gcHMubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgICAgIHZhciB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyBwYXJzZUZsb2F0KHBwc1swXSk7DQogICAgICAgICAgICB2YXIgeSA9IHBhcnNlRmxvYXQocHBzWzFdKTsNCiAgICAgICAgICAgIHggPSB4LnRvc3VpdHN2ZygpOw0KICAgICAgICAgICAgeSA9IHkudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICB2YXIgdHJzdHIgPSAndHJhbnNsYXRlKCcgKyB4ICsgJywnICsgeSArICcpJzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChwcy5zdWJzdHIoMCwgMikgPT0gJ21hJykgew0KICAgICAgICAgICAgdmFyIHBwcyA9IHBzLm1hdGNoKC8oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pXCkkLyk7DQogICAgICAgICAgICB2YXIgbWFBcnIgPSBbcGFyc2VGbG9hdChwcHNbMV0pLCBwYXJzZUZsb2F0KHBwc1szXSksIHBhcnNlRmxvYXQocHBzWzVdKSwgcGFyc2VGbG9hdChwcHNbN10pLCBwYXJzZUZsb2F0KHBwc1s5XSksIHBhcnNlRmxvYXQocHBzWzExXSldOw0KICAgICAgICAgICAgaWYgKG1hQXJyWzFdID09IDApIHsNCiAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pOw0KICAgICAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChjc1sxXSkgKyAxNjsNCiAgICAgICAgICAgICAgICB2YXIgeDEgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICB2YXIgeTEgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICB4MSA9IHgxLnRvc3VpdHN2ZygpOw0KICAgICAgICAgICAgICAgIHkxID0geTEudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgeDEgKyAnLCcgKyB5MSArICcpJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIHggPSBwYXJzZUZsb2F0KGNzWzBdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChjc1sxXSkgKyAxNjsNCiAgICAgICAgICAgICAgICB2YXIgeDEgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICB2YXIgeTEgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyAxNjsNCiAgICAgICAgICAgICAgICB5ID0gcGFyc2VGbG9hdChjc1sxXSk7DQogICAgICAgICAgICAgICAgdmFyIHgyID0geCAqIG1hQXJyWzBdICsgeSAqIG1hQXJyWzJdICsgbWFBcnJbNF07DQogICAgICAgICAgICAgICAgdmFyIHkyID0geCAqIG1hQXJyWzFdICsgeSAqIG1hQXJyWzNdICsgbWFBcnJbNV07DQogICAgICAgICAgICAgICAgdmFyIGZ4ID0geDEgPCB4MiA/IHgxLnRvc3VpdHN2ZygpIDogeDIudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIGZ5ID0geTEgPiB5MiA/IHkxLnRvc3VpdHN2ZygpIDogeTIudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIG9mZnkgPSBNYXRoLmFicyh5MSAtIHkyKTsNCiAgICAgICAgICAgICAgICB2YXIgdHJzdHIgPSAndHJhbnNsYXRlKCcgKyBmeCArICcsJyArIGZ5ICsgJyknOw0KICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIG9mZnkudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTYnKTsNCiAgICAgICAgICAgICAgICBwb3B1cFIuc2V0QXR0cmlidXRlKCd5JywgKC1vZmZ5KS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBwb3B1cFIuc2V0QXR0cmlidXRlKCdmaWxsJywgJ3RyYW5zcGFyZW50Jyk7DQogICAgICAgICAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQocG9wdXBSKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIHRyc3RyKTsNCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdjb21tZW50JywgJycpOw0KICAgICAgICBwb3B1cC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICBsZXQgY29tbWVudGlkID0gY29tbWVudHNbaV0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLmlkICsgIiwiICsgY29tbWVudHNbaV0ucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdlZDpjb21tZW50aWQnLCBjb21tZW50aWQpOw0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3ZnLWNvbnRhaW5lciA+IHN2ZzpudGgtY2hpbGQoJyArIGluZGV4ICsgJyknKS5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgICAgIGNvbW1lbnRzW2ldLm9ubW91c2VvdmVyID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgLy8gdmFyIGNvbW1lbnRpZCA9IHRoaXMucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcigncmVjdCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmNvbW1lbnRpZD0nIiArIGNvbW1lbnRpZCArICInXVtjb21tZW50XSIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB9Ow0KICAgICAgICBjb21tZW50c1tpXS5vbm1vdXNlb3V0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgLy8gdmFyIGNvbW1lbnRpZCA9IHRoaXMucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgICAgIC8vICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmNvbW1lbnRpZD0nIiArIGNvbW1lbnRpZCArICInXVtjb21tZW50XSIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICB9DQp9DQovLy0tY29tbWVudA0KLy9ub3RlLS0NCmlmICghdWEpIHsNCiAgICBmdW5jdGlvbiBnZXR3aChzLCBwKSB7DQogICAgICAgIHZhciBtYWlucCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBtYWlucC5zdHlsZS5jc3NUZXh0ID0gczsNCiAgICAgICAgbWFpbnAuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOw0KICAgICAgICBtYWlucC5zdHlsZS5tYXhXaWR0aCA9ICc0MDBweCc7DQogICAgICAgIG1haW5wLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnOw0KICAgICAgICBtYWlucC5pbm5lckhUTUwgPSBwOw0KICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1haW5wKTsNCiAgICAgICAgdmFyIHcgPSBtYWlucC5jbGllbnRXaWR0aDsNCiAgICAgICAgdmFyIGggPSBtYWlucC5jbGllbnRIZWlnaHQ7DQogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWFpbnApOw0KICAgICAgICByZXR1cm4gW3csIGhdDQogICAgfQ0KICAgIHN2Z0VsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgic3ZnIik7DQogICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBzdmdFbGVtcy5sZW5ndGg7IGluZGV4KyspIHsNCiAgICAgICAgdmFyIG5vdGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3ZnOm50aC1jaGlsZCgnICsgaW5kZXggKyAnKSBnPmdbZWRcXDpub3RlXScpOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgYSA9IG5vdGVzW2ldLmdldEF0dHJpYnV0ZSgnZWQ6bm90ZScpOw0KICAgICAgICAgICAgdmFyIG5vdGVMb2NrID0gbm90ZXNbaV0uZ2V0QXR0cmlidXRlKCdlZDpub3RlbG9jaycpOw0KICAgICAgICAgICAgaWYgKG5vdGVMb2NrID09ICd0cnVlJykgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG1haW5wID0gYS5tYXRjaCgvPGJvZHlbXj5dKj4oLiopPFwvYm9keT4vKVsxXTsNCiAgICAgICAgICAgIHZhciBtYWlucyA9IGEubWF0Y2goL3N0eWxlPSIoLio/KSIvKVsxXTsNCiAgICAgICAgICAgIHZhciBvdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTsNCiAgICAgICAgICAgIHZhciBvbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOw0KICAgICAgICAgICAgdmFyIHBvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdmb3JlaWduT2JqZWN0Jyk7DQogICAgICAgICAgICB2YXIgcG9wdXBSID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgICAgICB2YXIgaG92ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3JlY3QnKTsNCiAgICAgICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjY2RjZGZmJyk7DQogICAgICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpOw0KICAgICAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd5JywgJzAnKTsNCiAgICAgICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzE2Jyk7DQogICAgICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzE2Jyk7DQogICAgICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjYnKTsNCiAgICAgICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgbm90ZXNbaV0ucXVlcnlTZWxlY3RvcigndXNlJykuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSk7DQogICAgICAgICAgICBob3Zlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgbm90ZXNbaV0uYXBwZW5kQ2hpbGQoaG92ZXIpOw0KICAgICAgICAgICAgcG9wdXAuc3R5bGUuY3NzVGV4dCA9IG1haW5zOw0KICAgICAgICAgICAgcG9wdXAuaW5uZXJIVE1MID0gbWFpbnA7DQogICAgICAgICAgICB2YXIgd2ggPSBnZXR3aChtYWlucywgbWFpbnApOw0KICAgICAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdoWzBdKTsNCiAgICAgICAgICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgd2hbMV0pOw0KICAgICAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDgsNCknKTsNCiAgICAgICAgICAgIHBvcHVwLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnOw0KICAgICAgICAgICAgcG9wdXAuc3R5bGUudGV4dEFsaWduID0gJ2xlZnQnOw0KICAgICAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCd4JywgJzAnKTsNCiAgICAgICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneScsICcwJyk7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2hbMF0gKyAxNik7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHdoWzFdICsgOCk7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjYTI3YTAwJyk7DQogICAgICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2ZmZTc5ZCcpOw0KICAgICAgICAgICAgb3V0LmFwcGVuZENoaWxkKG9saW5lKTsNCiAgICAgICAgICAgIG91dC5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgICAgICAgICBvdXQuc2V0QXR0cmlidXRlKCdub3RlJywgJycpOw0KICAgICAgICAgICAgb3V0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICBsZXQgbm90ZWlkID0gbm90ZXNbaV0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLmlkICsgIiwiICsgbm90ZXNbaV0ucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgICAgIG91dC5zZXRBdHRyaWJ1dGUoJ2VkOm5vdGVpZCcsIG5vdGVpZCk7DQogICAgICAgICAgICBvdXQub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBvdXQub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbiA/IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVSYW5nZSh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmUpOmRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpOw0KDQogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHZhciBjcyA9IG5vdGVzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgICAgIHZhciBwcyA9IG5vdGVzW2ldLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTsNCiAgICAgICAgICAgIGlmIChwcy5zdWJzdHIoMCwgMikgPT0gJ3RyJykgew0KICAgICAgICAgICAgICAgIHZhciBwcHMgPSBwcy5tYXRjaCgvXCgoXFMqfFxTKlxzXFMqKVwpLylbMV0uc3BsaXQoLyB8LC8pOw0KICAgICAgICAgICAgICAgIHZhciB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyBwYXJzZUZsb2F0KHBwc1swXSk7DQogICAgICAgICAgICAgICAgdmFyIHkgPSBwYXJzZUZsb2F0KHBwc1sxXSk7DQogICAgICAgICAgICAgICAgeCA9IHgudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgeSA9IHkudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgeCArICcsJyArIHkgKyAnKSc7DQogICAgICAgICAgICB9IGVsc2UgaWYgKHBzLnN1YnN0cigwLCAyKSA9PSAnbWEnKSB7DQogICAgICAgICAgICAgICAgdmFyIHBwcyA9IHBzLm1hdGNoKC8oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pW1wsIF0oXC0/XGQrKFwuXGQrKT8pXCkkLyk7DQogICAgICAgICAgICAgICAgdmFyIG1hQXJyID0gW3BhcnNlRmxvYXQocHBzWzFdKSwgcGFyc2VGbG9hdChwcHNbM10pLCBwYXJzZUZsb2F0KHBwc1s1XSksIHBhcnNlRmxvYXQocHBzWzddKSwgcGFyc2VGbG9hdChwcHNbOV0pLCBwYXJzZUZsb2F0KHBwc1sxMV0pXTsNCiAgICAgICAgICAgICAgICBpZiAobWFBcnJbMV0gPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IHBhcnNlRmxvYXQoY3NbMV0pICsgMTY7DQogICAgICAgICAgICAgICAgICAgIHZhciB4MSA9IHggKiBtYUFyclswXSArIHkgKiBtYUFyclsyXSArIG1hQXJyWzRdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgeTEgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICAgICAgeDEgPSB4MS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICAgICAgeTEgPSB5MS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgeDEgKyAnLCcgKyB5MSArICcpJzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pICsgMTY7DQogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChjc1sxXSkgKyAxNjsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHgxID0geCAqIG1hQXJyWzBdICsgeSAqIG1hQXJyWzJdICsgbWFBcnJbNF07DQogICAgICAgICAgICAgICAgICAgIHZhciB5MSA9IHggKiBtYUFyclsxXSArIHkgKiBtYUFyclszXSArIG1hQXJyWzVdOw0KICAgICAgICAgICAgICAgICAgICB4ID0gcGFyc2VGbG9hdChjc1swXSkgKyAxNjsNCiAgICAgICAgICAgICAgICAgICAgeSA9IHBhcnNlRmxvYXQoY3NbMV0pOw0KICAgICAgICAgICAgICAgICAgICB2YXIgeDIgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHkyID0geCAqIG1hQXJyWzFdICsgeSAqIG1hQXJyWzNdICsgbWFBcnJbNV07DQogICAgICAgICAgICAgICAgICAgIHZhciBmeCA9IHgxIDwgeDIgPyB4MS50b3N1aXRzdmcoKSA6IHgyLnRvc3VpdHN2ZygpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZnkgPSB5MSA+IHkyID8geTEudG9zdWl0c3ZnKCkgOiB5Mi50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnkgPSBNYXRoLmFicyh5MSAtIHkyKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRyc3RyID0gJ3RyYW5zbGF0ZSgnICsgZnggKyAnLCcgKyBmeSArICcpJzsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgb2ZmeS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTYnKTsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgneScsICgtb2ZmeSkudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAndHJhbnNwYXJlbnQnKTsNCiAgICAgICAgICAgICAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQocG9wdXBSKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvdXQuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCB0cnN0cik7DQogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3ZnLWNvbnRhaW5lciA+IHN2ZzpudGgtY2hpbGQoJyArIGluZGV4ICsgJyknKS5hcHBlbmRDaGlsZChvdXQpOw0KICAgICAgICAgICAgbm90ZXNbaV0ub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgLy8gdmFyIG5vdGVpZCA9IG5vdGVpZDsNCiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6bm90ZWlkPSciICsgbm90ZWlkICsgIiddW25vdGVdIikuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgbm90ZXNbaV0ub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAvLyB2YXIgbm90ZWlkID0gbm90ZWlkOw0KICAgICAgICAgICAgICAgIC8vICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7DQogICAgICAgICAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCdyZWN0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6bm90ZWlkPSciICsgbm90ZWlkICsgIiddW25vdGVdIikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0gZWxzZSB7DQogICAgY29uc29sZS5sb2coJ+aKseatie+8jElF5rWP6KeI5Zmo5LiN5pSv5oyBbm90Zeino+aekO+8jOivt+S9v+eUqOWFtuS7luWGheaguOa1j+iniOWZqOOAguiwouiwou+8gScpDQp9DQovLy0tbm90ZQ0KLy9oeXBlcmxpbmstLQ0KZnVuY3Rpb24gZ2V0bWF4bGVuKGFyciwgYnJyKSB7DQogICAgdmFyIGwgPSAwOw0KICAgIHZhciBsbCA9IDA7DQogICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnIubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3RleHQnKTsNCiAgICAgICAgaWYgKCFpc05hTihsaW5rYXJyW2pdKSkgew0KICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9ICdQYWdlLScgKyBhcnJbal07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlLnRleHRDb250ZW50ID0gYXJyW2pdOw0KICAgICAgICB9DQogICAgICAgIGUuc3R5bGUuZm9udFNpemUgPSAnMTJweCc7DQogICAgICAgIGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N2ZycpWzBdLmFwcGVuZENoaWxkKGUpOw0KICAgICAgICB2YXIgZXcgPSBlLmdldEJCb3goKS53aWR0aDsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0ucmVtb3ZlQ2hpbGQoZSk7DQogICAgICAgIHZhciBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICd0ZXh0Jyk7DQogICAgICAgIGgudGV4dENvbnRlbnQgPSBicnJbal07DQogICAgICAgIGguc3R5bGUuZm9udFNpemUgPSAnMTJweCc7DQogICAgICAgIGguc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJzsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0uYXBwZW5kQ2hpbGQoaCk7DQogICAgICAgIHZhciBodyA9IGguZ2V0QkJveCgpLndpZHRoOw0KICAgICAgICBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKVswXS5yZW1vdmVDaGlsZChoKTsNCiAgICAgICAgbCA9IGV3ID4gaHcgPyBldyA6IGh3Ow0KICAgICAgICBsbCA9IGwgPiBsbCA/IGwgOiBsbDsNCiAgICB9DQogICAgcmV0dXJuIGxsOw0KfQ0Kc3ZnRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdmciKTsNCmZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPD0gc3ZnRWxlbXMubGVuZ3RoOyBpbmRleCsrKSB7DQogICAgbGV0IHN2Z0VsZW0gPSBzdmdFbGVtc1tpbmRleF07DQogICAgbGV0IGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgic3ZnOm50aC1jaGlsZCgiICsgaW5kZXggKyAiKSBnPmdbZWRcXDpoeXBlcmxpbmtdIikNCiAgICBjb25zb2xlLmxvZyhsaW5rcyk7DQogICAgLy8gdmFyIGxpbmtzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2c+Z1tlZFxcOmh5cGVybGlua10nKTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpOw0KICAgICAgICB2YXIgcG9wdXBSID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgIHZhciBob3ZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncmVjdCcpOw0KICAgICAgICB2YXIgZGVzY2FyciA9IFtdOw0KICAgICAgICB2YXIgbGlua2FyciA9IFtdOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2NkY2RmZicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3knLCAnMCcpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzE2Jyk7DQogICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgJzAuNicpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGxpbmtzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykpOw0KICAgICAgICBob3Zlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICBsaW5rc1tpXS5hcHBlbmRDaGlsZChob3Zlcik7DQogICAgICAgIC8vIGNvbnNvbGUubG9nKGxpbmtzW2ldLmdldEF0dHJpYnV0ZSgnZWQ6aHlwZXJsaW5rJykpOw0KICAgICAgICB2YXIgYSA9IEpTT04ucGFyc2UobGlua3NbaV0uZ2V0QXR0cmlidXRlKCdlZDpoeXBlcmxpbmsnKSk7DQogICAgICAgIHZhciBjcyA9IGxpbmtzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgdmFyIHBzID0gbGlua3NbaV0ucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpOw0KICAgICAgICBpZiAocHMuc3Vic3RyKDAsIDIpID09ICd0cicpIHsNCiAgICAgICAgICAgIHZhciBwcHMgPSBwcy5tYXRjaCgvXCgoXFMqfFxTKlxzXFMqKVwpLylbMV0uc3BsaXQoLyB8LC8pOw0KICAgICAgICAgICAgdmFyIHggPSBwYXJzZUZsb2F0KGNzWzBdKSArIHBhcnNlRmxvYXQocHBzWzBdKTsNCiAgICAgICAgICAgIHZhciB5ID0gcGFyc2VGbG9hdChwcHNbMV0pOw0KICAgICAgICAgICAgeCA9IHgudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICB5ID0geS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgIHZhciB0cnN0ciA9ICd0cmFuc2xhdGUoJyArIHggKyAnLCcgKyB5ICsgJyknOw0KICAgICAgICB9IGVsc2UgaWYgKHBzLnN1YnN0cigwLCAyKSA9PSAnbWEnKSB7DQogICAgICAgICAgICB2YXIgcHBzID0gcHMubWF0Y2goLyhcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylbXCwgXShcLT9cZCsoXC5cZCspPylcKSQvKTsNCiAgICAgICAgICAgIHZhciBtYUFyciA9IFtwYXJzZUZsb2F0KHBwc1sxXSksIHBhcnNlRmxvYXQocHBzWzNdKSwgcGFyc2VGbG9hdChwcHNbNV0pLCBwYXJzZUZsb2F0KHBwc1s3XSksIHBhcnNlRmxvYXQocHBzWzldKSwgcGFyc2VGbG9hdChwcHNbMTFdKV07DQogICAgICAgICAgICBpZiAobWFBcnJbMV0gPT0gMCkgew0KICAgICAgICAgICAgICAgIHZhciB4ID0gcGFyc2VGbG9hdChjc1swXSk7DQogICAgICAgICAgICAgICAgdmFyIHkgPSBwYXJzZUZsb2F0KGNzWzFdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHZhciB4MSA9IHggKiBtYUFyclswXSArIHkgKiBtYUFyclsyXSArIG1hQXJyWzRdOw0KICAgICAgICAgICAgICAgIHZhciB5MSA9IHggKiBtYUFyclsxXSArIHkgKiBtYUFyclszXSArIG1hQXJyWzVdOw0KICAgICAgICAgICAgICAgIHgxID0geDEudG9zdWl0c3ZnKCk7DQogICAgICAgICAgICAgICAgeTEgPSB5MS50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICB2YXIgdHJzdHIgPSAndHJhbnNsYXRlKCcgKyB4MSArICcsJyArIHkxICsgJyknOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoY3NbMF0pICsgMTY7DQogICAgICAgICAgICAgICAgdmFyIHkgPSBwYXJzZUZsb2F0KGNzWzFdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHZhciB4MSA9IHggKiBtYUFyclswXSArIHkgKiBtYUFyclsyXSArIG1hQXJyWzRdOw0KICAgICAgICAgICAgICAgIHZhciB5MSA9IHggKiBtYUFyclsxXSArIHkgKiBtYUFyclszXSArIG1hQXJyWzVdOw0KICAgICAgICAgICAgICAgIHggPSBwYXJzZUZsb2F0KGNzWzBdKSArIDE2Ow0KICAgICAgICAgICAgICAgIHkgPSBwYXJzZUZsb2F0KGNzWzFdKTsNCiAgICAgICAgICAgICAgICB2YXIgeDIgPSB4ICogbWFBcnJbMF0gKyB5ICogbWFBcnJbMl0gKyBtYUFycls0XTsNCiAgICAgICAgICAgICAgICB2YXIgeTIgPSB4ICogbWFBcnJbMV0gKyB5ICogbWFBcnJbM10gKyBtYUFycls1XTsNCiAgICAgICAgICAgICAgICB2YXIgZnggPSB4MSA8IHgyID8geDEudG9zdWl0c3ZnKCkgOiB4Mi50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICB2YXIgZnkgPSB5MSA+IHkyID8geTEudG9zdWl0c3ZnKCkgOiB5Mi50b3N1aXRzdmcoKTsNCiAgICAgICAgICAgICAgICB2YXIgb2ZmeSA9IE1hdGguYWJzKHkxIC0geTIpOw0KICAgICAgICAgICAgICAgIHZhciB0cnN0ciA9ICd0cmFuc2xhdGUoJyArIGZ4ICsgJywnICsgZnkgKyAnKSc7DQogICAgICAgICAgICAgICAgcG9wdXBSLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgb2ZmeS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBwb3B1cFIuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxNicpOw0KICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ3knLCAoLW9mZnkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHBvcHVwUi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAndHJhbnNwYXJlbnQnKTsNCiAgICAgICAgICAgICAgICBwb3B1cC5hcHBlbmRDaGlsZChwb3B1cFIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBhbCA9IGEubGVuZ3RoOw0KICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsOyBqKyspIHsNCiAgICAgICAgICAgIGxpbmthcnIucHVzaChhW2pdLmxpbmspOw0KICAgICAgICAgICAgZGVzY2Fyci5wdXNoKGFbal0uZGVzYyk7DQogICAgICAgIH0NCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCB0cnN0cik7DQogICAgICAgIHZhciBtYXggPSBnZXRtYXhsZW4obGlua2FyciwgZGVzY2Fycik7DQogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYWw7IGsrKykgew0KICAgICAgICAgICAgdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2EnKTsNCiAgICAgICAgICAgIHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyZWN0Jyk7DQogICAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAndGV4dCcpOw0KICAgICAgICAgICAgdmFyIGYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3RleHQnKTsNCiAgICAgICAgICAgIGlmIChpc05hTihsaW5rYXJyW2tdKSkgew0KICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgInhsaW5rIiwgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiKTsNCiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwgImhyZWYiLCBsaW5rYXJyW2tdKTsNCiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpOw0KICAgICAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSBsaW5rYXJyW2tdOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBlLnRleHRDb250ZW50ID0gJ1BhZ2UtJyArIGxpbmthcnJba107DQogICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAieGxpbmsiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIpOw0KICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCAiaHJlZiIsICIjIiArIGxpbmthcnJba10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgbWF4ICsgMTApOw0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICczMycpOw0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjOTk5OTk5Jyk7DQogICAgICAgICAgICBkLnNldEF0dHJpYnV0ZSgnZmlsbCcsICd3aGl0ZScpOw0KICAgICAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3knLCAzMyAqIGspOw0KICAgICAgICAgICAgZi50ZXh0Q29udGVudCA9IGRlc2NhcnJba107DQogICAgICAgICAgICBmLnN0eWxlLmZvbnRTaXplID0gJzEycHgnOw0KICAgICAgICAgICAgZi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnOw0KICAgICAgICAgICAgZi5zZXRBdHRyaWJ1dGUoJ3gnLCA1KTsNCiAgICAgICAgICAgIGYuc2V0QXR0cmlidXRlKCd5JywgMzMgKiBrICsgMTIpOw0KICAgICAgICAgICAgZS5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JzsNCiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCd5JywgMzMgKiBrICsgMjgpOw0KICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCA1KTsNCiAgICAgICAgICAgIGMuYXBwZW5kQ2hpbGQoZCk7DQogICAgICAgICAgICBjLmFwcGVuZENoaWxkKGYpOw0KICAgICAgICAgICAgYy5hcHBlbmRDaGlsZChlKTsNCiAgICAgICAgICAgIGMub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCdyZWN0Jykuc3R5bGUuZmlsbCA9ICcjZTFlMWZmJw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGMub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5maWxsID0gJ3doaXRlJw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKGMpOw0KICAgICAgICB9DQogICAgICAgIHBvcHVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnaHlwZXJsaW5rJywgJycpOw0KICAgICAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ2VkOmxpbmtpZCcsIGxpbmtzW2ldLnBhcmVudE5vZGUucGFyZW50Tm9kZS5pZCArICIsIiArIGxpbmtzW2ldLnBhcmVudE5vZGUuaWQpOw0KICAgICAgICBwb3B1cC5vbm1vdXNlb3ZlciA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIH07DQogICAgICAgIHBvcHVwLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH07DQogICAgICAgIHBvcHVwLm9ubW91c2VvdXQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH07DQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzdmctY29udGFpbmVyID4gc3ZnOm50aC1jaGlsZCgnICsgaW5kZXggKyAnKScpLmFwcGVuZENoaWxkKHBvcHVwKTsNCiAgICAgICAgbGlua3NbaV0ub25tb3VzZW92ZXIgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgbGlua2lkID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUuaWQgKyAiLCIgKyB0aGlzLnBhcmVudE5vZGUuaWQ7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDpsaW5raWQ9JyIgKyBsaW5raWQgKyAiJ11baHlwZXJsaW5rXSIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAgICAgLy8gcG9wdXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgIH0NCiAgICAgICAgbGlua3NbaV0ub25tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIC8vIHZhciBsaW5raWQgPSB0aGlzLnBhcmVudE5vZGUuaWQ7DQogICAgICAgICAgICB2YXIgbGlua2lkID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUuaWQgKyAiLCIgKyB0aGlzLnBhcmVudE5vZGUuaWQ7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmxpbmtpZD0nIiArIGxpbmtpZCArICInXVtoeXBlcmxpbmtdIikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIC8vIHBvcHVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8vLS1oeXBlcmxpbmsNCi8vaW5pdGlhbGl6ZS0tDQp2YXIgc2hhcGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdnW2VkXFw6dG9ndG9waWNpZF0nKTsNCnZhciBtSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdnW2VkXFw6dG9waWN0eXBlXScpOw0KdmFyIGRhdGFUcmVlID0ge307DQp2YXIgZXh0cmFSZWxhID0ge307DQp2YXIgY2hlY2tJRCA9ICcnOw0KZm9yICh2YXIgaSA9IDA7IGkgPCBtSWQubGVuZ3RoOyBpKyspIHsNCiAgICB2YXIgdHlwZSA9IG1JZFtpXS5nZXRBdHRyaWJ1dGUoJ2VkOnRvcGljdHlwZScpOw0KICAgIHZhciBzaWQgPSBtSWRbaV0uaWQ7DQogICAgaWYgKHR5cGUgIT09ICdjYWxsb3V0Jykgew0KICAgICAgICBpbml0KHNpZCwgZGF0YVRyZWUpDQogICAgfQ0KfQ0KZnVuY3Rpb24gaW5pdChpZCwgb2JqKSB7DQogICAgdmFyIGNoaWxkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDpwYXJlbnRpZD0nIiArIGlkICsgIiddOm5vdChbZWRcXDp0b3BpY3R5cGVdKSIpOw0KICAgIHZhciBjYWxscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDpwYXJlbnRpZD0nIiArIGlkICsgIiddW2VkXFw6dG9waWN0eXBlXSIpOw0KICAgIHZhciBzdW1tYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicGF0aFtlZFxcOnBhcmVudGlkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0nc3VtbWFyeSddIik7DQogICAgdmFyIGJvdW5kYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicGF0aFtlZFxcOnBhcmVudGlkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0nYm91bmRhcnknXSIpOw0KICAgIHZhciByZWxhZnJvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDpmcm9taWQqPSciICsgaWQgKyAiJ11bZWRcXDp0eXBlPSdyZWxhdGlvbiddIik7DQogICAgdmFyIHJlbGF0byA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImdbZWRcXDp0b2lkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0ncmVsYXRpb24nXSIpOw0KICAgIG9ialsibSIgKyBpZF0gPSB7fTsNCiAgICB2YXIgdHlwZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOnRvcGljdHlwZScpOw0KICAgIHZhciBpdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOndpZHRoJyk7DQogICAgdmFyIGloID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmdldEF0dHJpYnV0ZSgnZWQ6aGVpZ2h0Jyk7DQogICAgaWYgKHR5cGUpIHsNCiAgICAgICAgb2JqWyJtIiArIGlkXS50eXBlID0gdHlwZTsNCiAgICB9DQogICAgaWYgKGl3ICYmIGloKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0ud2lkdGggPSBpdzsNCiAgICAgICAgb2JqWyJtIiArIGlkXS5oZWlnaHQgPSBpaDsNCiAgICB9DQogICAgaWYgKHJlbGFmcm9tLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGFmcm9tID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVsYWZyb20ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBpbmRleGlkID0gcmVsYWZyb21baV0uaWQ7DQogICAgICAgICAgICB2YXIgdG9pZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGluZGV4aWQpLmdldEF0dHJpYnV0ZSgnZWQ6dG9pZCcpOw0KICAgICAgICAgICAgaWYgKGV4dHJhUmVsYVtpbmRleGlkXSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgZXh0cmFSZWxhW2luZGV4aWRdID0gew0KICAgICAgICAgICAgICAgICAgICBpZDogaW5kZXhpZCwNCiAgICAgICAgICAgICAgICAgICAgZnJvbWlkOiBpZCwNCiAgICAgICAgICAgICAgICAgICAgdG9pZDogdG9pZCwNCiAgICAgICAgICAgICAgICAgICAgaXNDOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGFmcm9tW2luZGV4aWRdID0ge307DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGFmcm9tLmRpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAocmVsYXRvLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGF0byA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbGF0by5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGluZGV4aWQgPSByZWxhdG9baV0uaWQ7DQogICAgICAgICAgICB2YXIgZnJvbWlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5kZXhpZCkuZ2V0QXR0cmlidXRlKCdlZDpmcm9taWQnKTsNCiAgICAgICAgICAgIGlmIChleHRyYVJlbGFbaW5kZXhpZF0gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtpbmRleGlkXSA9IHsNCiAgICAgICAgICAgICAgICAgICAgaWQ6IGluZGV4aWQsDQogICAgICAgICAgICAgICAgICAgIGZyb21pZDogZnJvbWlkLA0KICAgICAgICAgICAgICAgICAgICB0b2lkOiBpZCwNCiAgICAgICAgICAgICAgICAgICAgaXNDOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnJlbGF0b1tpbmRleGlkXSA9IHt9Ow0KICAgICAgICAgICAgb2JqWyJtIiArIGlkXS5yZWxhdG8uZGlzcGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgPyAnYmxvY2snIDogJ25vbmUnOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChjaGlsZHMubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0uY2hpbGQgPSB7fTsNCiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciICsgaWQgKyAiJ10iKSkgew0KICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOnRvZ3RvcGljaWQ9JyIgKyBpZCArICInXSIpLmNoaWxkTm9kZXNbMF0uZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykpOw0KICAgICAgICAgICAgdmFyIHRvZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciICsgaWQgKyAiJ10iKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndXNlJylbMF0uZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykuc2xpY2UoMSk7DQogICAgICAgICAgICBvYmpbIm0iICsgaWRdLnRvZ3R5cGUgPSB0b2c7DQogICAgICAgIH0NCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaWQgPSBjaGlsZHNbaV0uaWQ7DQogICAgICAgICAgICBpbml0KGNpZCwgb2JqWyJtIiArIGlkXS5jaGlsZCk7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGNhbGxzLmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLmNhbGwgPSB7fTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxscy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNpZCA9IGNhbGxzW2ldLmlkOw0KICAgICAgICAgICAgaW5pdChjaWQsIG9ialsibSIgKyBpZF0uY2FsbCk7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGJvdW5kYXJ5Lmxlbmd0aCAhPT0gMCkgew0KICAgICAgICBvYmpbIm0iICsgaWRdLmJvdW5kYXJ5ID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRhcnkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaWQgPSBib3VuZGFyeVtpXS5pZDsNCiAgICAgICAgICAgIGluaXQoY2lkLCBvYmpbIm0iICsgaWRdLmJvdW5kYXJ5KTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoc3VtbWFyeS5sZW5ndGggIT09IDApIHsNCiAgICAgICAgb2JqWyJtIiArIGlkXS5zdW1tYXJ5ID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VtbWFyeS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNpZCA9IHN1bW1hcnlbaV0uaWQ7DQogICAgICAgICAgICBpbml0KGNpZCwgb2JqWyJtIiArIGlkXS5zdW1tYXJ5KTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCi8vLS1pbml0aWFsaXplDQovL3RvZ2dsZWRpc3BsYXktLQ0KdmFyIGNoYWluQXJyID0gW107DQpmdW5jdGlvbiBnZXRjaGFpbihpZCkgew0KICAgIGNoYWluQXJyLnVuc2hpZnQoJ20nICsgaWQpOw0KICAgIHZhciBwYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuZ2V0QXR0cmlidXRlKCdlZDpwYXJlbnRpZCcpOw0KICAgIGlmICghcGFyZW50KSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgaWYgKHBhcmVudC5tYXRjaCgvXCwvKSkgew0KICAgICAgICBwYXJlbnQgPSBwYXJlbnQubWF0Y2goL1xkKyg/PVwsKS8pWzBdDQogICAgfQ0KICAgIGdldGNoYWluKHBhcmVudCk7DQp9DQpmdW5jdGlvbiBnZXRvYmooaWQpIHsNCiAgICBjaGFpbkFyciA9IFtdOw0KICAgIGdldGNoYWluKGlkKTsNCiAgICB2YXIgbWFpbiA9IGNoYWluQXJyWzBdOw0KICAgIGlmIChjaGFpbkFyci5sZW5ndGggPiAxKSB7DQogICAgICAgIHZhciBvYmogPSBkYXRhVHJlZVttYWluXTsNCiAgICAgICAgLy8gY29uc29sZS5sb2coY2hhaW5BcnIpOw0KICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNoYWluQXJyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgYSA9IGNoYWluQXJyW2ldOw0KICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgdmFyIGNvYmogPSBvYmpbT2JqZWN0LmtleXMob2JqKVtqXV1bYV07DQogICAgICAgICAgICAgICAgaWYgKGNvYmopIHsNCiAgICAgICAgICAgICAgICAgICAgb2JqID0gY29iajsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iag0KICAgIH0gZWxzZSB7DQogICAgICAgIHZhciBvYmogPSBkYXRhVHJlZVttYWluXTsNCiAgICAgICAgcmV0dXJuIG9iag0KICAgIH0NCg0KfQ0KZm9yICh2YXIgaSA9IDA7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykgew0KICAgIHNoYXBlW2ldLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBpZCA9IE51bWJlcih0aGlzLmdldEF0dHJpYnV0ZSgnZWQ6dG9ndG9waWNpZCcpKTsNCiAgICAgICAgdmFyIG9iaiA9IGdldG9iaihpZCk7DQoNCiAgICAgICAgdmFyIHR5cGUgPSBvYmoudG9ndHlwZSA9PT0gJ21pbnVzJyA/ICdwbHVzJyA6ICdtaW51cyc7DQogICAgICAgIHZhciBkaXNwbGF5ID0gb2JqLnRvZ3R5cGUgPT09ICdtaW51cycgPyAnbm9uZScgOiAnYmxvY2snOw0KICAgICAgICB0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd1c2UnKVswXS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCAnIycgKyB0eXBlKTsNCiAgICAgICAgb2JqLnRvZ3R5cGUgPSB0eXBlOw0KICAgICAgICBjaGVja0lEID0gb2JqOw0KDQogICAgICAgIHV0ZChvYmosIGlkLCBkaXNwbGF5KTsNCiAgICAgICAgZXh0cmFSZWxhRmluKCk7DQogICAgfQ0KfQ0KZnVuY3Rpb24gdXRkKG9iaiwgaWQsIHNob3csIG9jKSB7DQoNCiAgICB2YXIgcHNob3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJzsNCiAgICBpZiAob2JqLnJlbGFmcm9tKSB7DQogICAgICAgIGlmIChvYmoucmVsYWZyb20uZGlzcGxheSAhPT0gcHNob3cpIHsNCiAgICAgICAgICAgIHZhciByZWxhZnJvbXMgPSBPYmplY3Qua2V5cyhvYmoucmVsYWZyb20pOw0KICAgICAgICAgICAgcmVsYWZyb21zLnNwbGljZShyZWxhZnJvbXMuaW5kZXhPZignZGlzcGxheScpLCAxKTsNCiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVsYWZyb21zLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhZnJvbXNba107DQogICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvYmoucmVsYWZyb20uZGlzcGxheSA9IHBzaG93Ow0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvYmoucmVsYXRvKSB7DQogICAgICAgIGlmIChvYmoucmVsYXRvLmRpc3BsYXkgIT09IHBzaG93KSB7DQogICAgICAgICAgICB2YXIgcmVsYXRvcyA9IE9iamVjdC5rZXlzKG9iai5yZWxhdG8pOw0KICAgICAgICAgICAgcmVsYXRvcy5zcGxpY2UocmVsYXRvcy5pbmRleE9mKCdkaXNwbGF5JyksIDEpOw0KICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCByZWxhdG9zLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhdG9zW2tdOw0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtkXS5pc0MgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb2JqLnJlbGF0by5kaXNwbGF5ID0gcHNob3c7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKG9iai5jYWxsKSB7DQogICAgICAgIHZhciBjYWxscyA9IE9iamVjdC5rZXlzKG9iai5jYWxsKTsNCiAgICAgICAgaWYgKGNoZWNrSUQgIT09IG9iaikgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxscy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBhID0gY2FsbHNbaV0uc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgdmFyIGIgPSBvYmouY2FsbFtjYWxsc1tpXV07DQogICAgICAgICAgICAgICAgdmFyIGMgPSBiLnRvZ3R5cGU7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICAgICAgaWYgKGIucmVsYWZyb20gJiYgIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGIucmVsYWZyb20uZGlzcGxheSAhPT0gc2hvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGFmcm9tcyA9IE9iamVjdC5rZXlzKGIucmVsYWZyb20pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVsYWZyb21zLnNwbGljZShyZWxhZnJvbXMuaW5kZXhPZignZGlzcGxheScpLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVsYWZyb21zLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhZnJvbXNba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBiLnJlbGFmcm9tLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGF0byAmJiAhYykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoYi5yZWxhdG8uZGlzcGxheSAhPT0gc2hvdykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0b3MgPSBPYmplY3Qua2V5cyhiLnJlbGF0byk7DQogICAgICAgICAgICAgICAgICAgICAgICByZWxhdG9zLnNwbGljZShyZWxhdG9zLmluZGV4T2YoJ2Rpc3BsYXknKSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHJlbGF0b3MubGVuZ3RoOyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHJlbGF0b3Nba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBiLnJlbGF0by5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYykgew0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIiArIGEgKyAiJ10iKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICdtaW51cycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICgoYi5jYWxsIHx8IGIuYm91bmRhcnkgfHwgYi5zdW1tYXJ5KSAmJiBjID09PSAncGx1cycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93LCB0cnVlKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLmNhbGwgJiYgIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3csIHRydWUpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLnN1bW1hcnkgJiYgIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3cpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLmJvdW5kYXJ5ICYmICFjKSB7DQogICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvYmouc3VtbWFyeSkgew0KICAgICAgICB2YXIgc3VtbWFyeXMgPSBPYmplY3Qua2V5cyhvYmouc3VtbWFyeSk7DQogICAgICAgIGlmICgoY2hlY2tJRCAhPT0gb2JqICYmIChvYmoudG9ndHlwZSA9PT0gJ21pbnVzJyB8fCAhb2JqLnRvZ3R5cGUpKSB8fCBjaGVja0lEID09PSBvYmopIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VtbWFyeXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgYSA9IHN1bW1hcnlzW2ldLnNsaWNlKDEpOw0KICAgICAgICAgICAgICAgIHZhciBvc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS5nZXRBdHRyaWJ1dGUoJ2VkOnBhcmVudGlkJyk7DQogICAgICAgICAgICAgICAgaWYgKG9zcC5tYXRjaCgvXCwvKSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgb3NwYSA9IG9zcC5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgb3NwTCA9IDA7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvc3BhLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdyA9PSAnbm9uZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3NwYVtqXSkuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NwTCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zcEwrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3NwTCAhPT0gb3NwYS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhciBiID0gb2JqLnN1bW1hcnlbc3VtbWFyeXNbaV1dOw0KICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGEpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnN0eWxlLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKGMpew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIithKyInXSIpLnN0eWxlLmRpc3BsYXk9c2hvdzsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgaWYoYz09PSdtaW51cycpew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdykNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBpZiAoYi5jYWxsJiZjPT09J3BsdXMnKSB7DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICB1dGQoYixzaG93LHRydWUpDQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYoYi5jYWxsJiYhYykgew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB1dGQoYixzaG93LHRydWUpDQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhiKS5sZW5ndGggIT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3cpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChvYmouYm91bmRhcnkpIHsNCiAgICAgICAgdmFyIGJvdW5kYXJ5cyA9IE9iamVjdC5rZXlzKG9iai5ib3VuZGFyeSk7DQogICAgICAgIGlmIChjaGVja0lEICE9PSBvYmopIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRhcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGEgPSBib3VuZGFyeXNbaV0uc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgdmFyIGIgPSBvYmouYm91bmRhcnlbYm91bmRhcnlzW2ldXTsNCiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhhKTsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOnRvZ3RvcGljaWQ9JyIrYSsiJ10iKS5zdHlsZS5kaXNwbGF5PXNob3c7DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGlmKGM9PT0nbWludXMnKXsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLHNob3cpDQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2FsbCYmYz09PSdwbHVzJykgew0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdyx0cnVlKQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKGIuY2FsbCYmIWMpIHsNCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdyx0cnVlKQ0KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYikubGVuZ3RoICE9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoIW9jICYmIG9iai5jaGlsZCkgew0KICAgICAgICB2YXIgY2hpbGRzID0gT2JqZWN0LmtleXMob2JqLmNoaWxkKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBhID0gY2hpbGRzW2ldLnNsaWNlKDEpOw0KICAgICAgICAgICAgdmFyIGIgPSBvYmouY2hpbGRbY2hpbGRzW2ldXTsNCiAgICAgICAgICAgIHZhciBjID0gYi50b2d0eXBlOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICB2YXIgdFNQYXRoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigicGF0aFtlZFxcOnRvc3VwZXJpZD0nIiArIGEgKyAiJ10iKTsNCiAgICAgICAgICAgIGlmICh0U1BhdGgpIHsNCiAgICAgICAgICAgICAgICB0U1BhdGguc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgbm90ZVRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDpub3RldG89JyIgKyBhICsgIiddIik7DQogICAgICAgICAgICBpZiAobm90ZVRpcCkgew0KICAgICAgICAgICAgICAgIG5vdGVUaXAuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5yZWxhZnJvbSAmJiAhYykgew0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGFmcm9tLmRpc3BsYXkgIT09IHNob3cpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGFmcm9tcyA9IE9iamVjdC5rZXlzKGIucmVsYWZyb20pOw0KICAgICAgICAgICAgICAgICAgICByZWxhZnJvbXMuc3BsaWNlKHJlbGFmcm9tcy5pbmRleE9mKCdkaXNwbGF5JyksIDEpOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHJlbGFmcm9tcy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhZnJvbXNba107DQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYVJlbGFbZF0uaXNDID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBiLnJlbGFmcm9tLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChiLnJlbGF0byAmJiAhYykgew0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGF0by5kaXNwbGF5ICE9PSBzaG93KSB7DQogICAgICAgICAgICAgICAgICAgIHZhciByZWxhdG9zID0gT2JqZWN0LmtleXMoYi5yZWxhdG8pOw0KICAgICAgICAgICAgICAgICAgICByZWxhdG9zLnNwbGljZShyZWxhdG9zLmluZGV4T2YoJ2Rpc3BsYXknKSwgMSk7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVsYXRvcy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSByZWxhdG9zW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFSZWxhW2RdLmlzQyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYi5yZWxhdG8uZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIiArIGEgKyAiJ10iKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ21pbnVzJykgew0KICAgICAgICAgICAgICAgICAgICB1dGQoYiwgYSwgc2hvdykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKChiLmNhbGwgfHwgYi5ib3VuZGFyeSB8fCBiLnN1bW1hcnkpICYmIGMgPT09ICdwbHVzJykgew0KICAgICAgICAgICAgICAgICAgICB1dGQoYiwgYSwgc2hvdywgdHJ1ZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5jYWxsICYmICFjKSB7DQogICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3csIHRydWUpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5zdW1tYXJ5ICYmICFjKSB7DQogICAgICAgICAgICAgICAgdXRkKGIsIGEsIHNob3cpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5ib3VuZGFyeSAmJiAhYykgew0KICAgICAgICAgICAgICAgIHV0ZChiLCBhLCBzaG93KQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBleHRyYVJlbGFGaW4oKSB7DQogICAgdmFyIGV4dHJha2V5cyA9IE9iamVjdC5rZXlzKGV4dHJhUmVsYSk7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRyYWtleXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgdmFyIGV4dHJhT2JqID0gZXh0cmFSZWxhW2V4dHJha2V5c1tpXV07DQogICAgICAgIGlmIChleHRyYU9iai5pc0MgPT09IHRydWUpIHsNCiAgICAgICAgICAgIHZhciBmc2hvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGV4dHJhT2JqLmZyb21pZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAgICAgdmFyIHRzaG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXh0cmFPYmoudG9pZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZXh0cmFPYmouaWQpLnN0eWxlLmRpc3BsYXkgPSBmc2hvdyAmJiB0c2hvdyA/ICdibG9jaycgOiAnbm9uZSc7DQogICAgICAgICAgICBleHRyYVJlbGFbZXh0cmFrZXlzW2ldXS5pc0MgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCn0='))</script>
  </body>
</html>
